2019鐵人賽
PHP
CRUD
其實很想在開始之前先聊聊 sql 語法的,不過一但開始用了框架,就又覺得 sql 語法其實大概知道就好。
框架把 sql 語法包裝了很多糖衣,使用起來很方便,跟原生的 sql 語法也相差甚遠,但不代表就真的不用學了,大家還是得花點時間搞懂基本的 sql 語法,否則一但沒了框架就不能使用資料庫,這樣的後端工程師也太悲哀了吧。
言歸正傳,今天要用到很多 sql 語法,只有一個重點要注意,就是字串符的「""」、「''」什麼時候要加什麼時候不用加。
其實有個小訣竅,那就是跟資料庫、資料表有關的都不用加,例如:資料表名稱,欄位名稱。而要填入的 value 就要加。好了,廢話太多,開始看 code 吧。
用一個 form 來做網路請求,方法使用 post。這裡 action 先留空,我們等有資料而且寫入資料表之後在導回首頁(所以導航指令寫在 php 語法裡,下面再講)。
裡面簡單作幾個 text field 供使用者輸入姓名、生日、email,在給個 button 送出。
這邊還埋了一個隱藏請求 name = action, value = add,這是為了檢查請求來源的簡單做法。
新建一個檔案 create.php
程式碼如下:
<html>
<head>
<meta charset="UTF-8" />
<title>新增會員資料</title>
</head>
<body>
<form action="" method="post" name="formAdd" id="formAdd">
請輸入姓名:<input type="text" name="cName" id="cName"><br/>
請輸入生日:<input type="date" name="cBirthday" id="cBirthday"><br/>
請輸入Email:<input type="text" name="cEmail" id="cEmail"><br/>
<input type="hidden" name="action" value="add">
<input type="submit" name="button" value="新增資料">
<input type="reset" name="button2" value="重新填寫">
</form>
</body>
</html>
效果如下:
先確保請求來源是從剛剛的 form 傳過來,我們先檢查 post 過來的資料裡面是不是有一個 name = action, value = add 的請求。如果是,就開始連結資料庫跟寫入資料。
連結資料庫,寫入資料表,導航回首頁。
<?php
//先檢查請求來源是否是我們上面創建的 form
if (isset($_POST["action"])&&($_POST["action"] == "add")) {
//引入檔,負責連結資料庫
include("connMySQL.php");
//取得請求過來的資料
$name = $_POST["cName"];
$birthday = $_POST['cBirthday'];
$email = $_POST['cEmail'];
//資料表查訪指令,請注意 "" , '' 的位置
//INSERT INTO 就是新建一筆資料進哪個表的哪個欄位
$sql_query = "INSERT INTO members (cName, cBirthday, cEmail) VALUES ('$name',
'$birthday','$email')";
//對資料庫執行查訪的動作
mysqli_query($db_link,$sql_query);
//導航回首頁
header("Location: index.php");
}
?>
效果如下:
讓使用者資訊可以直接呈現在 text field 裡面,當使用者按下按鈕,就寫入資料表。
表格跟 create.php 類似,只是 text field 裡面多了一些 php 語法,是後面拿到資料後可以填入。
<html>
<head>
<meta charset="UTF-8" />
<title>修改會員資料</title>
</head>
<body>
<form action="" method="post" name="formAdd" id="formAdd">
請輸入姓名:<input type="text" name="cName" id="cName" value=" <?php echo $name ?>"><br/>
請輸入生日:<input type="date" name="cBirthday" id="cBirthday" value="<?php echo $birthday ?>"><br/>
請輸入Email:<input type="text" name="cEmail" id="cEmail" value="<?php echo $email ?>"><br/>
<input type="hidden" name="action" value="update">
<input type="submit" name="button" value="修改資料">
</form>
</body>
</html>
效果如下:
text field 看起來很奇怪,沒關係!我們繼續往下做。
取得使用者 ID,在利用 ID 查詢資料表以取得使用者的資料。
只要在 URL 後方加上?Key=Value
就是一個標準帶 parameter 的網路請求,而我們就可以透過 URL 的 parameter 取得 ID。
<?php
include "connMySQL.php";
$userID = $_GET['id'];
//請注意,這邊因為 $userID 本身是 integer,所以可以不用加 ''
$sql_getDataQuery = "SELECT * FROM members WHERE cID = $userID";
$result = mysqli_query($db_link, $sql_getDataQuery);
$row_result = mysqli_fetch_assoc($result);
$id = $row_result['cID'];
$name = $row_result['cName'];
$birthday = $row_result['cBirthday'];
$email = $row_result['cEmail'];
?>
效果如下:
將使用者修改完的資料,一樣透過按鈕將資料存入資料庫。
跟建立的時候一樣,只是這次是要修改已經存在資料表中的資料,所以語法要改成 UPDATE 資料表 SET 列名稱 = 新值 WHERE 列名稱 = 某值。
最後一樣導航回首頁。
<?php
if (isset($_POST["action"]) && $_POST["action"] == 'update') {
$newName = $_POST['cName'];
$newBirthday = $_POST['cBirthday'];
$newEmail = $_POST['cEmail'];
$sql_query = "UPDATE members SET cName = '$newName', cBirthday = '$newBirthday', cEmail = '$newEmail' WHERE cID = $userID";
mysqli_query($db_link,$sql_query);
$db_link->close();
header('Location: index.php');
}
?>
效果如下
由於我們沒什麼身份驗證的考量,一但觸發刪除的動作,就會直接從資料表刪除使用者,所以刪除是裡面最簡單的。
創建一個 delete.php 檔案,透過 URL 的 parameter 取得 ID,剩下的直接看 code 吧
<?php
$userId = $_GET['id'];
include ('connMysql.php');
$sql_query = "DELETE FROM members WHERE cID = $userId";
mysqli_query($db_link,$sql_query);
$db_link->close();
header("Location: index.php");
?>
以上就是最簡單的 CRUD,但是之中還是缺乏很多實作上的機制,例如:登入系統。因為沒有登入系統,導致隨便一個使用者只要 URL 的位置對,參數對,就可以任意修改資料跟刪除資料,這安全堪憂阿!!